@Serializable class TestObj { @SerialName("enumListProp") var listEnumProp: List<@Serializable(with = TestEnumSerializers.NotNullable::class) TestEnum>? = null } enum class TestEnum(val value: Int) { RED(0), GREEN(1), BLUE(2); } object TestEnumSerializers { var map = TestEnum.values().associateBy(TestEnum::value) object Nullable : KSerializer { override val descriptor: SerialDescriptor get() = StringDescriptor override fun deserialize(decoder: Decoder): TestEnum? { return try { val value = decoder.decodeInt() map[value] } catch (exception: NumberFormatException) { null } } override fun serialize(encoder: Encoder, obj: TestEnum?) { obj?.value?.let { encoder.encodeInt(it) } } } object NotNullable : KSerializer { override val descriptor: SerialDescriptor get() = StringDescriptor override fun deserialize(decoder: Decoder): TestEnum { return map.getValue(decoder.decodeInt()) } override fun serialize(encoder: Encoder, obj: TestEnum) { obj.value.let { encoder.encodeInt(it) } } } }